home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / dalla rivista / amiga.free / diropus4.12b_gpl / config / main1.c < prev    next >
C/C++ Source or Header  |  2000-01-27  |  30KB  |  956 lines

  1. /*
  2.  
  3. Directory Opus 4
  4. Original GPL release version 4.12
  5. Copyright 1993-2000 Jonathan Potter
  6.  
  7. This program is free software; you can redistribute it and/or
  8. modify it under the terms of the GNU General Public License
  9. as published by the Free Software Foundation; either version 2
  10. of the License, or (at your option) any later version.
  11.  
  12. This program is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. GNU General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with this program; if not, write to the Free Software
  19. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  20.  
  21. All users of Directory Opus 4 (including versions distributed
  22. under the GPL) are entitled to upgrade to the latest version of
  23. Directory Opus version 5 at a reduced price. Please see
  24. http://www.gpsoft.com.au for more information.
  25.  
  26. The release of Directory Opus 4 under the GPL in NO WAY affects
  27. the existing commercial status of Directory Opus 5.
  28.  
  29. */
  30.  
  31. #include "config.h"
  32.  
  33. dooperationconfig()
  34. {
  35.     ULONG class;
  36.     USHORT code,gadgetid,qual;
  37.     char *flag=NULL,*flag2=NULL;
  38.     struct ConfigUndo *undo;
  39.     struct Gadget *gad;
  40.     int lastsel=-1,a,disppos=0,b,formatwin=0,x,y;
  41.     struct DOpusListView *view;
  42.     struct DOpusRemember *borderkey=NULL;
  43.  
  44.     showconfigscreen(CFG_OPERATION);
  45.     undo=makeundo(UNDO_MAIN);
  46.  
  47.     FOREVER {
  48.         Wait(1<<Window->UserPort->mp_SigBit);
  49.         while (IMsg=getintuimsg()) {
  50.             if (lastsel!=OP_FORMAT ||
  51.                 ((view=ListViewIDCMP(listformatlists,IMsg))==(struct DOpusListView *)-1)) {
  52.                 class=IMsg->Class; code=IMsg->Code; qual=IMsg->Qualifier;
  53.                 x=IMsg->MouseX; y=IMsg->MouseY;
  54.                 if (class==GADGETUP || class==GADGETDOWN) {
  55.                     gad=(struct Gadget *)IMsg->IAddress;
  56.                     gadgetid=gad->GadgetID;
  57.                 }
  58.                 ReplyMsg((struct Message *)IMsg);
  59.                 switch (class) {
  60.                     case IDCMP_MENUPICK:
  61.                         if (code==MENUNULL) break;
  62.                         if (lastsel>-1) {
  63.                             maingad[lastsel].Flags&=~SELECTED;
  64.                             select_gadget(&maingad[lastsel],0);
  65.                             if (lastsel==OP_FORMAT) {
  66.                                 RemoveGList(Window,formatgads,(network)?10:8);
  67.                                 RemoveListView(listformatlists,2);
  68.                             }
  69.                             removetickgads();
  70.                             lastsel=-1;
  71.                         }
  72.                         switch ((a=ITEMNUM(code))) {
  73.                             case 0:
  74.                             case 1:
  75.                                 doload(CFG_OPERATION,a);
  76.                                 break;
  77.                         }
  78.                         break;
  79.  
  80.                     case IDCMP_MOUSEBUTTONS:
  81.                         if (code==MENUDOWN && lastsel==OP_FORMAT) {
  82.                             fixrmbimage(&formatclearrmb,NULL,0,x,y);
  83.                             a=DoRMBGadget(&formatclearrmb,Window);
  84.                             fixrmbimage(&formatclearrmb,NULL,1,-1,-1);
  85.                             if (a==0) goto clearlast;
  86.                         }
  87.                         break;
  88.  
  89.                     case IDCMP_GADGETUP:
  90.                     case IDCMP_GADGETDOWN:
  91.                         if (gadgetid>=GAD_BASE && flag) {
  92.                             if (gadgetid<5000)
  93.                                 *flag=processtickgad(operationgadgets[lastsel],(int)*flag,gadgetid-GAD_BASE,0);
  94.                             else *flag2=processtickgad(operationgadgets[lastsel],(int)*flag2,gadgetid-5000,1);
  95.                         }
  96.                         else switch (gadgetid) {
  97.                             case OP_CANCEL:
  98.                                 doundo(undo,UNDO_MAIN);
  99.                             case OP_OKAY:
  100.                                 doundo(undo,0);
  101.                                 if (lastsel==OP_FORMAT) {
  102.                                     RemoveGList(Window,formatgads,(network)?10:8);
  103.                                     RemoveListView(listformatlists,2);
  104.                                     LFreeRemember(&borderkey);
  105.                                 }
  106.                                 return((gadgetid==OP_OKAY));
  107.  
  108.                             case FORMAT_CLEAR:
  109.                                 if (qual&(IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT)) {
  110. clearlast:
  111.                                     for (a=15;a>=0;a--) {
  112.                                         if (config->displaypos[formatwin][a]!=-1) {
  113.                                             if (config->sortmethod[formatwin]==config->displaypos[formatwin][a]) {
  114.                                                 config->sortmethod[formatwin]=-1;
  115.                                                 listformatlists[1].itemselected=-1;
  116.                                             }
  117.                                             config->displaypos[formatwin][a]=-1;
  118.                                             break;
  119.                                         }
  120.                                     }
  121.                                     disppos=fixformlist(formatwin);
  122.                                     break;
  123.                                 }
  124.                             case FORMAT_RESET:
  125.                                 for (a=0;a<16;a++) config->displaypos[formatwin][a]=-1;
  126.                                 if (gadgetid==FORMAT_RESET) {
  127.                                     for (a=0;a<5;a++) config->displaypos[formatwin][a]=a;
  128.                                     config->sortmethod[formatwin]=0;
  129.                                 }
  130.                                 else config->sortmethod[formatwin]=-1;
  131.                                 listformatlists[1].itemselected=config->sortmethod[formatwin];
  132.                                 disppos=fixformlist(formatwin);
  133.                                 break;
  134.  
  135.                             case FORMAT_LENGTH+0:
  136.                             case FORMAT_LENGTH+1:
  137.                             case FORMAT_LENGTH+2:
  138.                             case FORMAT_LENGTH+3:
  139.                             case FORMAT_LENGTH+4:
  140.                                 b=gadgetid-FORMAT_LENGTH;
  141.                                 a=atoi(formatlen_buf[b]);
  142.                                 if (a<5) a=5; else if (a>maxlength[b]) a=maxlength[b];
  143.                                 lsprintf(formatlen_buf[b],"%ld",a);
  144.                                 RefreshStrGad(gad,Window);
  145.                                 config->displaylength[formatwin][b]=a;
  146.                                 if (code!=0x9) getnextgadget(gad);
  147.                                 break;
  148.  
  149.                             case FORMAT_WINDOW:
  150.                                 formatwin=1-formatwin;
  151.                                 DoCycleGadget(&formatgads[0],Window,windownames,formatwin);
  152.                                 DoCycleGadget(&formatgads[3],Window,separatenames,config->separatemethod[formatwin]);
  153.                                 if (config->sortflags&(1<<formatwin)) formatgads[4].Flags|=GFLG_SELECTED;
  154.                                 else formatgads[4].Flags&=~GFLG_SELECTED;
  155.                                 RefreshGList(&formatgads[4],Window,NULL,1);
  156.                                 listformatlists[1].itemselected=-1;
  157.                                 for (a=0;a<16;a++) {
  158.                                     if (config->displaypos[formatwin][a]==-1) break;
  159.                                     if (config->displaypos[formatwin][a]==config->sortmethod[formatwin]) {
  160.                                         listformatlists[1].itemselected=a;
  161.                                         break;
  162.                                     }
  163.                                 }
  164.                                 disppos=fixformlist(formatwin);
  165.                                 fixdisplaylengths(formatwin);
  166.                                 break;
  167.  
  168.                             case FORMAT_SEPARATE:
  169.                                 if (qual&(IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT)) {
  170.                                     if ((--config->separatemethod[formatwin])<0)
  171.                                         config->separatemethod[formatwin]=2;
  172.                                 }
  173.                                 else if ((++config->separatemethod[formatwin])>2)
  174.                                     config->separatemethod[formatwin]=0;
  175.                                 DoCycleGadget(&formatgads[3],Window,separatenames,config->separatemethod[formatwin]);
  176.                                 break;
  177.  
  178.                             case FORMAT_REVERSESORT:
  179.                                 config->sortflags^=1<<formatwin;
  180.                                 break;
  181.  
  182.                             default:
  183.                                 flag=NULL;
  184.                                 if (lastsel>-1 && lastsel!=gadgetid) {
  185.                                     maingad[lastsel].Flags&=~SELECTED;
  186.                                     select_gadget(&maingad[lastsel],0);
  187.                                     makehelpname((char *)-1);
  188.                                     doscreentitle(cfg_string[STR_OPERATION_SCREEN]);
  189.                                 }
  190.                                 if (lastsel==OP_FORMAT) {
  191.                                     RemoveGList(Window,formatgads,(network)?10:8);
  192.                                     RemoveListView(listformatlists,2);
  193.                                     LFreeRemember(&borderkey);
  194.                                 }
  195.                                 if (lastsel==gadgetid) {
  196.                                     removetickgads();
  197.                                     lastsel=-1;
  198.                                     makehelpname((char *)-1);
  199.                                     doscreentitle(cfg_string[STR_OPERATION_SCREEN]);
  200.                                     break;
  201.                                 }
  202.                                 lastsel=gadgetid;
  203.                                 flag2=NULL;
  204.                                 makehelpname(operationgads[gadgetid]);
  205.                                 doscreentitle(currenthelpname);
  206.                                 switch (gadgetid) {
  207.                                     case OP_COPY: flag=&(config->copyflags); flag2=&(config->existflags); break;
  208.                                     case OP_DATEFORMAT: flag=&(config->dateformat); break;
  209.                                     case OP_DELETE: flag=&(config->deleteflags); break;
  210.                                     case OP_ERRORCHECK: flag=&(config->errorflags); break;
  211.                                     case OP_GENERAL: flag=&(config->generalflags); break;
  212.                                     case OP_ICONS: flag=&(config->iconflags); break;
  213.                                     case OP_UPDATE: flag=&(config->dynamicflags); break;
  214.                                     case OP_FORMAT:
  215.                                         removetickgads();
  216.                                         setuplist(&listformatlists[0],181,38);
  217.                                         setuplist(&listformatlists[1],181,112);
  218.                                         listformatlists[1].itemselected=-1;
  219.                                         for (a=0;a<16;a++) {
  220.                                             if (config->displaypos[formatwin][a]==-1) break;
  221.                                             if (config->displaypos[formatwin][a]==config->sortmethod[formatwin]) {
  222.                                                 listformatlists[1].itemselected=a;
  223.                                                 break;
  224.                                             }
  225.                                         }
  226.                                         if (!(AddListView(listformatlists,2))) {
  227.                                             lastsel=-1;
  228.                                             break;
  229.                                         }
  230.                                         if (config->sortflags&(1<<formatwin)) formatgads[4].Flags|=GFLG_SELECTED;
  231.                                         else formatgads[4].Flags&=~GFLG_SELECTED;
  232.                                         SetAPen(rp,screen_pens[1].pen);
  233.  
  234.                                         AddGadgetBorders(&borderkey,
  235.                                             &formatgads[0],
  236.                                             1,
  237.                                             screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);
  238.                                         AddGadgetBorders(&borderkey,
  239.                                             &formatgads[1],
  240.                                             1,
  241.                                             screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);
  242.                                         AddGadgetBorders(&borderkey,
  243.                                             &formatgads[3],
  244.                                             1,
  245.                                             screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);
  246.                                         AddGadgets(Window,
  247.                                             formatgads,
  248.                                             formatgadgets,
  249.                                             (network)?10:8,
  250.                                             screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen,1);
  251.                                         fixrmbimage(&formatclearrmb,&formatgads[2],2,-1,-1);
  252.  
  253.                                         formatwin=0;
  254.                                         DoCycleGadget(&formatgads[0],Window,windownames,formatwin);
  255.                                         DoCycleGadget(&formatgads[3],Window,separatenames,config->separatemethod[formatwin]);
  256.                                         disppos=fixformlist(formatwin);
  257.                                         fixdisplaylengths(formatwin);
  258.                                         UScoreText(rp,
  259.                                             cfg_string[STR_AVAILABLE_DISPLAY_ITEMS],
  260.                                             x_off+156,y_off+34,
  261.                                             -1);
  262.                                         UScoreText(rp,
  263.                                             cfg_string[STR_SELECTED_DISPLAY_ITEMS],
  264.                                             x_off+156,y_off+108,
  265.                                             -1);
  266.                                         UScoreText(rp,
  267.                                             cfg_string[STR_DISPLAYED_LENGTHS],
  268.                                             x_off+430,y_off+34,
  269.                                             -1);
  270.                                         UScoreText(rp,
  271.                                             cfg_string[STR_CHECK_INDICATES_SORT],
  272.                                             x_off+161,y_off+179,
  273.                                             -1);
  274.                                         UScoreText(rp,
  275.                                             cfg_string[STR_ENTRY_SEPARATION],
  276.                                             x_off+416,y_off+152,
  277.                                             -1);
  278.                                         BltTemplate((PLANEPTR)DOpusBase->pdb_check,0,2,rp,x_off+169,y_off+173,13,7);
  279.                                         flag=NULL;
  280.                                         break;
  281.                                 }
  282.                                 if (flag) inittickgads(operationgadgets[gadgetid],(int)*flag,(flag2)?(int)*flag2:0);
  283.                                 break;
  284.                         }
  285.                         break;
  286.                 }
  287.             }
  288.             else if (view) {
  289.                 if (view->listid==1) {
  290.                     b=view->itemselected;
  291.                     if (disppos<FORMAT_MAXNUM) {
  292.                         for (a=0;a<disppos;a++) {
  293.                             if (config->displaypos[formatwin][a]==b) break;
  294.                         }
  295.                         if (a==disppos) {
  296.                             config->displaypos[formatwin][disppos]=b;
  297.                             disppos=fixformlist(formatwin);
  298.                         }
  299.                     }
  300.                 }
  301.                 else if (view->listid==2) {
  302.                     a=config->displaypos[formatwin][view->itemselected];
  303.                     if (config->sortmethod[formatwin]==a)
  304.                         config->sortmethod[formatwin]=-1;
  305.                     else config->sortmethod[formatwin]=a;
  306.                 }
  307.             }
  308.         }
  309.     }
  310. }
  311.  
  312. dosystemconfig()
  313. {
  314.     ULONG class;
  315.     USHORT code,gadgetid,qual,hotcode,hotqual;
  316.     char *flag=NULL,*flag2=NULL,buf[80],buf1[80],buf2[80],*ptr;
  317.     struct ConfigUndo *undo;
  318.     struct Gadget *gad;
  319.     struct ConfigGadget *congad;
  320.     int a,lastsel=-1,tick,x,y;
  321.     struct DOpusListView *view;
  322.     struct dopusfiletype *type;
  323.     char module_sel_array[NUM_MODULES];
  324.     struct DOpusRemember *lang_key=NULL;
  325.     char old_language[30];
  326.  
  327.     showconfigscreen(CFG_SYSTEM);
  328.     undo=makeundo(UNDO_MAIN|UNDO_FILETYPE);
  329.     hotcode=config->hotkeycode; hotqual=config->hotkeyqual;
  330.     strcpy(old_language,config->language);
  331.  
  332.     FOREVER {
  333.         Wait(1<<Window->UserPort->mp_SigBit);
  334.         while (IMsg=getintuimsg()) {
  335.             if (!(lastsel==SYS_ICONS &&
  336.                 (view=ListViewIDCMP(&iconlistview,IMsg))!=(struct DOpusListView *)-1) &&
  337.                 !(lastsel==SYS_MODULES &&
  338.                 (view=ListViewIDCMP(&modulelist,IMsg))!=(struct DOpusListView *)-1)) {
  339.                 class=IMsg->Class; code=IMsg->Code; qual=IMsg->Qualifier;
  340.                 x=IMsg->MouseX; y=IMsg->MouseY;
  341.                 if (class==IDCMP_GADGETUP || class==IDCMP_GADGETDOWN) {
  342.                     gad=(struct Gadget *)IMsg->IAddress;
  343.                     gadgetid=gad->GadgetID;
  344.                 }
  345.                 ReplyMsg((struct Message *)IMsg);
  346.                 switch (class) {
  347.                     case IDCMP_MOUSEBUTTONS:
  348.                         if (code==MENUDOWN && lastsel==SYS_HOTKEYS) {
  349.                             if (fixrmbimage(&sampleclearrmb,NULL,0,x,y)) {
  350.                                 a=DoRMBGadget(&sampleclearrmb,Window);
  351.                                 fixrmbimage(&sampleclearrmb,NULL,1,-1,-1);
  352.                                 if (a==0) {
  353.                                     hotcode=(USHORT)~0;
  354.                                     hotqual=0;
  355.                                     showkey(hotcode,hotqual,x_off+138,y_off+71,360,10);
  356.                                 }
  357.                                 hotkeygad.Flags&=~SELECTED;
  358.                                 help_ok=1;
  359.                             }
  360.                         }
  361.                         break;
  362.  
  363.                     case IDCMP_RAWKEY:
  364.                         if (lastsel!=SYS_HOTKEYS || code&0x80 || !(hotkeygad.Flags&SELECTED))
  365.                             break;
  366.                         qual&=IEQUALIFIER_LCOMMAND|IEQUALIFIER_RCOMMAND|
  367.                             IEQUALIFIER_CONTROL|IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT|
  368.                             IEQUALIFIER_LALT|IEQUALIFIER_RALT;
  369.                         if (code>=0x60 && code<=0x67) code=(USHORT)~0;
  370.                         showkey((hotcode=code),(hotqual=qual),x_off+138,y_off+71,360,10);
  371.                         break;
  372.  
  373.                     case IDCMP_MENUPICK:
  374.                         if (code==MENUNULL) break;
  375.                         if (lastsel>-1) {
  376.                             maingad[lastsel].Flags&=~SELECTED;
  377.                             select_gadget(&maingad[lastsel],0);
  378.                             if (lastsel==SYS_HOTKEYS) {
  379.                                 config->hotkeycode=hotcode; config->hotkeyqual=hotqual;
  380.                                 RemoveGList(Window,&hotkeygad,-1);
  381.                             }
  382.                             else if (lastsel==SYS_ICONS) {
  383.                                 RemoveGList(Window,icongads,4);
  384.                                 RemoveListView(&iconlistview,1);
  385.                                 system_makeiconlist(0);
  386.                             }
  387.                             else if (lastsel==SYS_MODULES) {
  388.                                 RemoveListView(&modulelist,2);
  389.                                 LFreeRemember(&lang_key);
  390.                             }
  391.                             removetickgads();
  392.                             lastsel=-1;
  393.                         }
  394.                         switch ((a=ITEMNUM(code))) {
  395.                             case 0:
  396.                             case 1:
  397.                                 if (doload(CFG_SYSTEM,a))
  398.                                     configmsg(CONFIG_NEW_HOTKEY);
  399.                                 break;
  400.                         }
  401.                         break;
  402.  
  403.                     case IDCMP_GADGETUP:
  404.                     case IDCMP_GADGETDOWN:
  405.                         if (gadgetid>=REQ_BASE) {
  406.                             congad=(struct ConfigGadget *)gad->UserData;
  407.                             ptr=((struct StringInfo *)congad->gad->SpecialInfo)->Buffer;
  408.                             if (system_requester(ptr,congad->buffer,congad->gad,congad->bit))
  409.                                 processtickgad(systemgadgets[lastsel],0,-1,-1);
  410.                         }
  411.                         else if (gadgetid>=STRING_BASE) {
  412.                             processtickgad(systemgadgets[lastsel],0,-1,-1);
  413.                             switch (lastsel) {
  414.                                 case SYS_DIRECTORIES:
  415.                                     if ((a=atoi(buf))<1) a=1;
  416.                                     else if (a>255) a=255;
  417.                                     config->bufcount=a;
  418.                                     break;
  419.                                 case SYS_AMIGADOS:
  420.                                     config->priority=atoi(buf);
  421.                                     break;
  422.                                 case SYS_VIEWPLAY:
  423.                                     config->showdelay=atoi(buf);
  424.                                     config->fadetime=atoi(buf1);
  425.                                     config->tabsize=atoi(buf2);
  426.                                     break;
  427.                             }
  428.                             if (code!=0x9) getnextgadget(gad);
  429.                         }
  430.                         else if (gadgetid>=GAD_BASE && flag) {
  431.                             if (gadgetid<5000) *flag=processtickgad(systemgadgets[lastsel],(int)*flag,gadgetid-GAD_BASE,0);
  432.                             else *flag2=processtickgad(systemgadgets[lastsel],(int)*flag2,gadgetid-5000,1);
  433.                         }
  434.                         else switch (gadgetid) {
  435.                             case SYS_CANCEL:
  436.                                 doundo(undo,UNDO_MAIN|UNDO_FILETYPE);
  437.                             case SYS_OKAY:
  438.                                 if (gadgetid==SYS_OKAY) {
  439.                                     LParsePatternI(config->showpat,config->showpatparsed);
  440.                                     LParsePatternI(config->hidepat,config->hidepatparsed);
  441.                                     config->hotkeycode=hotcode; config->hotkeyqual=hotqual;
  442.                                     configmsg(CONFIG_NEW_HOTKEY);
  443.                                     if (strcmp(config->language,old_language)) {
  444.                                         busy();
  445.                                         read_strings();
  446.                                         readhelp();
  447.                                         unbusy();
  448.                                     }
  449.                                 }
  450.                                 switch (lastsel) {
  451.                                     case SYS_HOTKEYS:
  452.                                         RemoveGList(Window,&hotkeygad,-1);
  453.                                         help_ok=1;
  454.                                         break;
  455.                                     case SYS_ICONS:
  456.                                         RemoveGList(Window,icongads,4);
  457.                                         RemoveListView(&iconlistview,1);
  458.                                         system_makeiconlist(0);
  459.                                         break;
  460.                                     case SYS_MODULES:
  461.                                         RemoveListView(&modulelist,2);
  462.                                         LFreeRemember(&lang_key);
  463.                                         break;
  464.                                 }
  465.                                 doundo(undo,0);
  466.                                 help_ok=1;
  467.                                 return((gadgetid==SYS_OKAY));
  468.  
  469.                             case HOTKEY_SAMPLE:
  470.                                 if (hotkeygad.Flags&SELECTED) {
  471.                                     config->hotkeycode=config->hotkeyqual=(USHORT)~0;
  472.                                     help_ok=0;
  473.                                 }
  474.                                 else {
  475.                                     config->hotkeycode=hotcode;
  476.                                     config->hotkeyqual=hotqual;
  477.                                     help_ok=1;
  478.                                 }
  479.                                 configmsg(CONFIG_NEW_HOTKEY);
  480.                                 break;
  481.  
  482.                             case HOTKEY_MMB:
  483.                                 config->hotkeyflags^=1;
  484.                                 configmsg(CONFIG_NEW_HOTKEY);
  485.                                 break;
  486.  
  487.                             case ICON_ICONREQ:
  488.                                 if (iconlistview.itemselected<0) break;
  489.                                 if (!system_requester(edit_funcbuf,NULL,&icongads[1],0)) break;
  490.  
  491.                             case ICON_ICONPATH:
  492.                                 if (iconlistview.itemselected<0) break;
  493.                                 ptr=NULL;
  494.                                 switch (iconlistview.itemselected) {
  495.                                     case 0: ptr=config->drawericon; break;
  496.                                     case 1: ptr=config->toolicon; break;
  497.                                     case 2: ptr=config->projecticon; break;
  498.                                     default:
  499.                                         for (a=3,type=firsttype;a<iconlistview.itemselected && type;a++,type=type->next);
  500.                                         if (type) {
  501.                                             if (edit_funcbuf[0]) {
  502.                                                 if ((type->iconpath=LAllocRemember(&typekey,strlen(edit_funcbuf)+1,0)))
  503.                                                     strcpy(type->iconpath,edit_funcbuf);
  504.                                             }
  505.                                             else type->iconpath=NULL;
  506.                                         }
  507.                                         break;
  508.                                 }
  509.                                 if (ptr) LStrnCpy(ptr,edit_funcbuf,79);
  510.                                 if (edit_funcbuf[0]) iconlistview.items[iconlistview.itemselected][1]='*';
  511.                                 else iconlistview.items[iconlistview.itemselected][1]=' ';
  512.                                 RefreshListView(&iconlistview,1);
  513.                                 system_showicon(edit_funcbuf,iconlistview.itemselected);
  514.                                 if (code!=0x9) getnextgadget(gad);
  515.                                 break;
  516.  
  517.                             case ICON_TOOLREQ:
  518.                                 if (!system_requester(edit_pathbuf,NULL,&icongads[3],0)) break;
  519.                             case ICON_TOOLPATH:
  520.                                 LStrnCpy(config->defaulttool,edit_pathbuf,79);
  521.                                 if (code!=0x9) getnextgadget(gad);
  522.                                 break;
  523.  
  524.                             default:
  525.                                 flag=NULL;
  526.                                 if (lastsel>-1 && lastsel!=gadgetid) {
  527.                                     maingad[lastsel].Flags&=~SELECTED;
  528.                                     select_gadget(&maingad[lastsel],0);
  529.                                     makehelpname((char *)-1);
  530.                                     doscreentitle(cfg_string[STR_SYSTEM_SCREEN]);
  531.                                 }
  532.                                 switch (lastsel) {
  533.                                     case SYS_HOTKEYS:
  534.                                         config->hotkeycode=hotcode;
  535.                                         config->hotkeyqual=hotqual;
  536.                                         RemoveGList(Window,&hotkeygad,-1);
  537.                                         help_ok=1;
  538.                                         break;
  539.                                     case SYS_ICONS:
  540.                                         RemoveGList(Window,icongads,4);
  541.                                         RemoveListView(&iconlistview,1);
  542.                                         system_makeiconlist(0);
  543.                                         break;
  544.                                     case SYS_MODULES:
  545.                                         RemoveListView(&modulelist,2);
  546.                                         LFreeRemember(&lang_key);
  547.                                         break;
  548.                                 }
  549.                                 if (lastsel==gadgetid) {
  550.                                     removetickgads();
  551.                                     lastsel=-1;
  552.                                     makehelpname((char *)-1);
  553.                                     doscreentitle(cfg_string[STR_SYSTEM_SCREEN]);
  554.                                     break;
  555.                                 }
  556.                                 lastsel=gadgetid;
  557.                                 flag2=NULL; tick=1;
  558.                                 makehelpname(systemgads[gadgetid]);
  559.                                 doscreentitle(currenthelpname);
  560.                                 switch (gadgetid) {
  561.                                     case SYS_CLOCK: flag=&(config->scrclktype); flag2=&(config->icontype); break;
  562.                                     case SYS_DIRECTORIES: flag=&(config->dirflags); flag2=&(config->showfree); break;
  563.                                     case SYS_SHOWPATTERN: flag=&(config->hiddenbit); break;
  564.                                     case SYS_VIEWPLAY: flag=&(config->viewbits); break;
  565.                                     case SYS_ICONS: tick=0; break;
  566.                                 }
  567.                                 if (tick) inittickgads(systemgadgets[gadgetid],(flag)?(int)*flag:0,(flag2)?(int)*flag2:0);
  568.                                 switch (gadgetid) {
  569.                                     case SYS_AMIGADOS:
  570.                                         lsprintf(buf,"%ld",config->priority);
  571.                                         makestring(config->outputcmd,config->output,config->shellstartup,
  572.                                             buf,NULL);
  573.                                         break;
  574.                                     case SYS_STARTUP:
  575.                                         makestring(config->autodirs[0],config->autodirs[1],
  576.                                             config->startupscript,config->uniconscript,config->configreturnscript,NULL);
  577.                                         break;
  578.                                     case SYS_DIRECTORIES:
  579.                                         lsprintf(buf,"%ld",config->bufcount);
  580.                                         makestring(buf,NULL);
  581.                                         break;
  582.                                     case SYS_HOTKEYS:
  583.                                         SetAPen(rp,screen_pens[1].pen);
  584.                                         hotkeygad.Flags&=~GFLG_SELECTED;
  585.                                         if (config->hotkeyflags&1) hotkeymmbgad.Flags|=GFLG_SELECTED;
  586.                                         else hotkeymmbgad.Flags&=~GFLG_SELECTED;
  587.                                         UScoreText(rp,
  588.                                             cfg_string[STR_UNICONIFY_HOTKEY],
  589.                                             x_off+166,y_off+64,
  590.                                             -1);
  591.                                         AddGadgets(Window,
  592.                                             &hotkeygad,
  593.                                             hotkeygadgets,
  594.                                             2,
  595.                                             screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen,1);
  596.                                         fixrmbimage(&sampleclearrmb,&hotkeygad,2,-1,-1);
  597.                                         showkey((hotcode=config->hotkeycode),
  598.                                             (hotqual=config->hotkeyqual),
  599.                                             x_off+138,y_off+71,
  600.                                             360,10);
  601.                                         break;
  602.                                     case SYS_MODULES:
  603.                                         busy();
  604.                                         for (a=0;a<NUM_MODULES;a++) {
  605.                                             if (config->loadexternal&external_module_map[a])
  606.                                                 module_sel_array[a]=LVARRAY_SELECTED;
  607.                                             else module_sel_array[a]=0;
  608.                                             if (!(FindSystemFile(external_module_name[a],buf,80,SYSFILE_MODULE)))
  609.                                                 module_sel_array[a]|=2;
  610.                                         }
  611.                                         modulelist.items=external_module_list;
  612.                                         modulelist.selectarray=module_sel_array;
  613.                                         get_language_list(&lang_key);
  614.                                         setuplist(&modulelist,200,18);
  615.                                         setuplist(&languagelist,200,115);
  616.                                         unbusy();
  617.                                         if (!(AddListView(&modulelist,2))) {
  618.                                             lastsel=-1;
  619.                                             break;
  620.                                         }
  621.                                         SetAPen(rp,screen_pens[1].pen);
  622.                                         UScoreText(rp,
  623.                                             cfg_string[STR_MODULE_LIST_CHECK_STRING],
  624.                                             x_off+200,y_off+83,
  625.                                             -1);
  626.                                         BltTemplate((PLANEPTR)DOpusBase->pdb_check,0,2,rp,x_off+208,y_off+77,13,7);
  627.                                         UScoreText(rp,
  628.                                             cfg_string[STR_LANGUAGE_LIST_CHECK_STRING],
  629.                                             x_off+200,y_off+180,
  630.                                             -1);
  631.                                         BltTemplate((PLANEPTR)DOpusBase->pdb_check,0,2,rp,x_off+208,y_off+174,13,7);
  632.                                         break;
  633.                                     case SYS_VIEWPLAY:
  634.                                         lsprintf(buf,"%ld",config->showdelay);
  635.                                         lsprintf(buf1,"%ld",config->fadetime);
  636.                                         lsprintf(buf2,"%ld",config->tabsize);
  637.                                         makestring(buf,buf1,buf2,NULL);
  638.                                         break;
  639.                                     case SYS_SHOWPATTERN:
  640.                                         makestring(config->showpat,config->hidepat,NULL);
  641.                                         break;
  642.                                     case SYS_ICONS:
  643.                                         removetickgads();
  644.                                         setuplist(&iconlistview,140,19);
  645.                                         system_makeiconlist(1);
  646.                                         if (!(AddListView(&iconlistview,1))) {
  647.                                             system_makeiconlist(0);
  648.                                             lastsel=-1;
  649.                                             break;
  650.                                         }
  651.                                         SetAPen(rp,screen_pens[1].pen);
  652.                                         UScoreText(rp,
  653.                                             cfg_string[STR_PROJECTS_DEFAULT_TOOL],
  654.                                             x_off+172,y_off+150,
  655.                                             -1);
  656.                                         strcpy(edit_pathbuf,config->defaulttool);
  657.                                         edit_funcbuf[0]=0;
  658.                                         AddGadgets(Window,
  659.                                             icongads,
  660.                                             NULL,
  661.                                             4,
  662.                                             screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen,1);
  663.                                         Do3DBox(rp,
  664.                                             x_off+459,y_off+126,
  665.                                             149,40,
  666.                                             screen_pens[config->gadgetbotcol].pen,screen_pens[config->gadgettopcol].pen);
  667.                                         doglassimage(&icongads[0]);
  668.                                         doglassimage(&icongads[2]);
  669.                                         flag=NULL;
  670.                                         break;
  671.                                 }
  672.                                 break;
  673.                         }
  674.                         break;
  675.                 }
  676.             }
  677.             else if (view) {
  678.                 switch (view->listid) {
  679.                     case 3:
  680.                         ptr=NULL;
  681.                         switch (view->itemselected) {
  682.                             case -1: break;
  683.                             case 0: ptr=config->drawericon; break;
  684.                             case 1: ptr=config->toolicon; break;
  685.                             case 2: ptr=config->projecticon; break;
  686.                             default:
  687.                                 for (a=3,type=firsttype;a<iconlistview.itemselected && type;a++,type=type->next);
  688.                                 if (type && type->iconpath) ptr=type->iconpath;
  689.                                 break;
  690.                         }
  691.                         if (ptr) strcpy(edit_funcbuf,ptr);
  692.                         else edit_funcbuf[0]=0;
  693.                         RefreshStrGad(&icongads[1],Window);
  694.                         ActivateStrGad(&icongads[1],Window);
  695.                         system_showicon(edit_funcbuf,view->itemselected);
  696.                         break;
  697.                     case 5:
  698.                         if (config->loadexternal&external_module_map[view->itemselected])
  699.                             config->loadexternal&=~external_module_map[view->itemselected];
  700.                         else config->loadexternal|=external_module_map[view->itemselected];
  701.                         break;
  702.                     case 6:
  703.                         if (strcmp(view->items[view->itemselected],"English (built-in)")==0)
  704.                             config->language[0]=0;
  705.                         else strcpy(config->language,view->items[view->itemselected]);
  706.                         break;
  707.                 }
  708.             }
  709.         }
  710.     }
  711. }
  712.  
  713. void getnextgadget(fgad)
  714. struct Gadget *fgad;
  715. {
  716.     struct Gadget *gad;
  717.  
  718.     if (fgad->GadgetType==GTYP_STRGADGET) RefreshStrGad(fgad,Window);
  719.     gad=fgad->NextGadget;
  720.     while (gad) {
  721.         if (gad->GadgetType==GTYP_STRGADGET && !(gad->Flags&GFLG_DISABLED)) {
  722.             ActivateStrGad(gad,Window);
  723.             return;
  724.         }
  725.         gad=gad->NextGadget;
  726.     }
  727.     gad=Window->FirstGadget;
  728.     while (gad && gad!=fgad) {
  729.         if (gad->GadgetType==GTYP_STRGADGET && !(gad->Flags&GFLG_DISABLED)) {
  730.             ActivateStrGad(gad,Window);
  731.             return;
  732.         }
  733.         gad=gad->NextGadget;
  734.     }
  735. }
  736.  
  737. fixformlist(win)
  738. int win;
  739. {
  740.     int a,b,d;
  741.  
  742.     for (a=0;a<FORMAT_MAXNUM;a++) {
  743.         for (d=0;d<a;d++) {
  744.             if (config->displaypos[win][a]==config->displaypos[win][d])
  745.                 config->displaypos[win][a]=-1;
  746.         }
  747.         if ((b=config->displaypos[win][a])<FORMAT_MAXNUM && b>-1)
  748.             selectedformatnames[a]=formatnames[b];
  749.         else break;
  750.     }
  751.     selectedformatnames[a]=NULL;
  752.     RefreshListView(&listformatlists[1],1);
  753.     return(a);
  754. }
  755.  
  756. void fixdisplaylengths(win)
  757. int win;
  758. {
  759.     int a,lim;
  760.  
  761.     lim=(network)?5:3;
  762.     for (a=0;a<lim;a++) {
  763.         if (config->displaylength[win][a]<5) config->displaylength[win][a]=5;
  764.         else if (config->displaylength[win][a]>maxlength[a])
  765.             config->displaylength[win][a]=maxlength[a];
  766.         lsprintf(formatlen_buf[a],"%ld",config->displaylength[win][a]);
  767.     }
  768.     RefreshGList(&formatgads[5],Window,NULL,lim);
  769. }
  770.  
  771. system_requester(buf,buf2,gad,bit)
  772. char *buf,*buf2;
  773. struct Gadget *gad;
  774. int bit;
  775. {
  776.     if (!buf[0]) {
  777.         if (buf2 && CheckExist(buf2,NULL)) strcpy(dirbuf,buf2);
  778.         else dirbuf[0]=0;
  779.         filebuf[0]=0;
  780.     }
  781.     else makefilebuffer(buf);
  782.     if (bit==0) {
  783.         filereq.flags=0;
  784.         filereq.title=cfg_string[STR_SELECT_DESIRED_FILE];
  785.     }
  786.     else {
  787.         filereq.flags=DFRF_DIRREQ;
  788.         filereq.title=cfg_string[STR_SELECT_DESIRED_DIRECTORY];
  789.     }
  790.     filereq.window=Window;
  791.     if (FileRequest(&filereq)) {
  792.         strcpy(buf,dirbuf);
  793.         if (bit==0) TackOn(buf,filebuf,256);
  794.         RefreshStrGad(gad,Window);
  795.         return(1);
  796.     }
  797.     return(0);
  798. }
  799.  
  800. void system_makeiconlist(make)
  801. int make;
  802. {
  803.     static struct DOpusRemember *key=NULL;
  804.     struct dopusfiletype *type;
  805.     int a,count;
  806.  
  807.     LFreeRemember(&key);
  808.     if (make) {
  809.         for (count=3,type=firsttype;type;count++,type=type->next) {
  810.             if (LStrCmpI(type->type,"Default")==0) --count;
  811.         }
  812.         if (iconlistview.items=LAllocRemember(&key,(count+1)*4,MEMF_CLEAR)) {
  813.             for (a=0;a<3;a++) iconlistview.items[a]=icontypes[a];
  814.             if (config->drawericon[0]) icontypes[0][1]='*'; else icontypes[0][1]=' ';
  815.             if (config->toolicon[0]) icontypes[1][1]='*'; else icontypes[1][1]=' ';
  816.             if (config->projecticon[0]) icontypes[2][1]='*'; else icontypes[2][1]=' ';
  817.             for (a=3,type=firsttype;a<count;a++,type=type->next) {
  818.                 if (LStrCmpI(type->type,"Default")==0) --a;
  819.                 else if (iconlistview.items[a]=LAllocRemember(&key,strlen(type->type)+4,0)) {
  820.                     strcpy(iconlistview.items[a],"   ");
  821.                     strcat(iconlistview.items[a],type->type);
  822.                     if (type->iconpath) iconlistview.items[a][1]='*';
  823.                 }
  824.             }
  825.         }
  826.         iconlistview.itemselected=-1; iconlistview.topitem=0;
  827.     }
  828. }
  829.  
  830. void system_showicon(iconfile,deftype)
  831. char *iconfile;
  832. int deftype;
  833. {
  834.     struct DiskObject *icon;
  835.     char iconbuf[256],*ptr;
  836.     int x,y;
  837.     struct Image *image;
  838.     struct Rectangle cliprec;
  839.     struct Region *reg,*oldreg;
  840.  
  841.     cliprec.MinX=x_off+459;
  842.     cliprec.MinY=y_off+126;
  843.     cliprec.MaxX=x_off+607;
  844.     cliprec.MaxY=y_off+165;
  845.     SetAPen(rp,screen_pens[0].pen);
  846.     RectFill(rp,y_off+459,y_off+126,x_off+607,y_off+165);
  847.     if (!IconBase) return;
  848.     strcpy(iconbuf,iconfile);
  849.     if ((ptr=strstri(iconbuf,".info"))) *ptr=0;
  850.     if (!iconbuf[0] || !(icon=GetDiskObject(iconbuf))) {
  851.         if (version2<OSVER_37 || deftype>2) return;
  852.         icon=GetDefDiskObject((deftype==0)?WBDRAWER:((deftype==1)?WBTOOL:WBPROJECT));
  853.         if (!icon) return;
  854.     }
  855.     if (reg=NewRegion()) {
  856.         OrRectRegion(reg,&cliprec);
  857.         oldreg=InstallClipRegion(Window->WLayer,reg);
  858.     }
  859.     image=(struct Image *)icon->do_Gadget.GadgetRender;
  860.     if ((x=x_off+459+((149-image->Width)/2))<(x_off+459)) x=x_off+456;
  861.     if ((y=y_off+126+((40-image->Height)/2))<(y_off+126)) y=y_off+126;
  862.     DrawImage(rp,image,x,y);
  863.     FreeDiskObject(icon);
  864.     if (reg) {
  865.         InstallClipRegion(Window->WLayer,oldreg);
  866.         DisposeRegion(reg);
  867.     }
  868. }
  869.  
  870. char *lock_dirs[]={
  871.     "DOpus:S/",
  872.     "S:"};
  873.  
  874. void get_language_list(key)
  875. struct DOpusRemember **key;
  876. {
  877.     char *tempbuf;
  878.     BPTR lock;
  879.     struct FileInfoBlock __aligned fib;
  880.     char pattern[30],buf[30];
  881.     APTR wsave;
  882.     int a,num,def;
  883.  
  884.     languagelist.items=NULL;
  885.  
  886.     if (!(tempbuf=LAllocRemember(key,2500,MEMF_CLEAR))) return;
  887.     strcpy(tempbuf,"English (built-in)");
  888.     num=1;
  889.     LParsePatternI("DO_#?.STR",pattern);
  890.  
  891.     wsave=myproc->pr_WindowPtr;
  892.     myproc->pr_WindowPtr=(APTR)-1;
  893.  
  894.     for (a=0;a<2;a++) {
  895.         if (lock=Lock(lock_dirs[a],ACCESS_READ)) {
  896.             Examine(lock,&fib);
  897.             while (ExNext(lock,&fib)) {
  898.                 if (fib.fib_DirEntryType<0 &&
  899.                     LMatchPatternI(pattern,fib.fib_FileName)) {
  900.                     strcpy(buf,&fib.fib_FileName[3]);
  901.                     buf[(strlen(buf)-4)]=0;
  902.                     strcpy(&tempbuf[num*25],buf);
  903.                     if ((++num)>99) break;
  904.                 }
  905.             }
  906.             UnLock(lock);
  907.         }
  908.         if (num>99) break;
  909.     }
  910.  
  911.     myproc->pr_WindowPtr=wsave;
  912.  
  913.     if (!(languagelist.items=LAllocRemember(key,(num+1)*sizeof(char *),MEMF_CLEAR)))
  914.         return;
  915.  
  916.     for (a=0;a<num;a++) languagelist.items[a]=&tempbuf[a*25];
  917.     quicksort(languagelist.items,0,num-1);
  918.  
  919.     languagelist.itemselected=-1;
  920.     for (a=0;a<num;a++) {
  921.         if (LStrCmpI(config->language,languagelist.items[a])==0)
  922.             languagelist.itemselected=a;
  923.         else if (strcmp(languagelist.items[a],"English (built-in)")==0)
  924.             def=a;
  925.     }
  926.     if (languagelist.itemselected==-1) languagelist.itemselected=def;
  927. }
  928.  
  929. void quicksort(array,left,right)
  930. char **array;
  931. int left,right;
  932. {
  933.     int i,last;
  934.  
  935.     if (left>=right) return;
  936.     sortswap(array,left,(left+right)/2);
  937.     last=left;
  938.     for (i=left+1;i<=right;i++)
  939.         if (LStrCmpI(array[i],array[left])<0)
  940.             sortswap(array,++last,i);
  941.     sortswap(array,left,last);
  942.     quicksort(array,left,last-1);
  943.     quicksort(array,last+1,right);
  944. }
  945.  
  946. void sortswap(array,i,j)
  947. char **array;
  948. int i,j;
  949. {
  950.     char *temp;
  951.  
  952.     temp=array[i];
  953.     array[i]=array[j];
  954.     array[j]=temp;
  955. }
  956.